const express = require('express');
const axios = require('axios');
const { v4: uuidv4 } = require('uuid');
const cors = require('cors');
const config = require('./config');
const INTERVIEW_QUESTIONS = require('./questions');
const app = express();

// 配置项
const PORT = config.PORT;
const SILICONFLOW_API_KEY = config.SILICONFLOW_API_KEY;
const SILICONFLOW_API_URL = config.SILICONFLOW_API_URL;

// 会话存储
const sessions = {};

// 中间件
app.use(cors({
  origin: ['http://localhost:3000', 'http://localhost:3001'],
  methods: ['GET', 'POST'],
  credentials: true
}));
app.use(express.json());
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

// 面试系统核心逻辑
class InterviewSystem {
  constructor() {
    this.questionHistory = [];
  }

  // 获取学校列表
  getSchools() {
    return Object.entries(INTERVIEW_QUESTIONS.schools).map(([id, school]) => ({
      id,
      name: school.name
    }));
  }

  // 根据学校选择问题
  selectQuestion(schoolId) {
    const school = INTERVIEW_QUESTIONS.schools[schoolId];
    if (!school) {
      throw new Error('学校不存在');
    }

    const questions = school.questions;
    const question = questions[Math.floor(Math.random() * questions.length)];
    
    return {
      question,
      school: school.name
    };
  }
}

const interviewSystem = new InterviewSystem();

// API端点
app.get('/schools', (req, res) => {
  res.json(interviewSystem.getSchools());
});

app.post('/start-interview', (req, res) => {
  const { schoolId } = req.body;
  if (!schoolId) {
    return res.status(400).json({ error: '请选择学校' });
  }

  const sessionId = uuidv4();
  try {
    const questionData = interviewSystem.selectQuestion(schoolId);
    sessions[sessionId] = {
      history: [],
      startTime: new Date(),
      school: questionData.school
    };
    res.json({ sessionId, ...questionData });
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});

app.post('/submit-answer', async (req, res) => {
  const { sessionId, answer } = req.body;
  
  if (!sessions[sessionId]) {
    return res.status(404).json({ error: '会话不存在' });
  }

  // 记录用户回答
  sessions[sessionId].history.push({
    role: 'user',
    content: answer,
    timestamp: new Date()
  });

  // 获取AI反馈
  try {
    const aiResponse = await axios.post(
      SILICONFLOW_API_URL,
      {
        model: "deepseek-ai/DeepSeek-V3",
        messages: [{
          role: "system",
          content: `# 角色设定
你是一名兼具高中班主任和大学面试官双重身份的资深教育专家，需要：
1. 以高中教师视角分析学生当前表现，结合学科知识和学习习惯。
2. 以大学导师视角预测发展潜力，关注专业契合度、独立学习能力和研究兴趣。
3. 提供可操作的提升方案，衔接高中与大学。

# 面试信息
- 目标学校：${sessions[sessionId].school}
- 面试题目：${sessions[sessionId].history[0].content}

# 反馈结构模板
**【基础评估】**  
"作为你的面试官，我认为你..."  
✓ 突出优势（3-4条）：
1. 学科知识应用：例如"能熟练运用《政治生活》中'民主监督'知识点分析社区治理问题（必修2第4课）"
2. 实践能力体现：例如"通过化学实验竞赛经历，展现出严谨的数据记录习惯（提及具体实验操作细节）"
3. 思维特质：例如"回答时展现批判性思维，能辩证看待网红经济现象（结合经济生活第5课市场调节局限性）"
4. 个人特质：例如"志愿服务经历体现共情能力（需具体说明服务场景中的行为细节）"

✎ 现存短板（3-4条）：
1. 知识迁移不足：例如"对物理必修一匀变速运动公式的应用仅停留在解题层面，未能联系汽车刹车系统等生活实例"
2. 表达问题：例如"使用过多口语化词汇'然后'（平均每句1.2次），影响表达专业性"
3. 论证缺陷：例如"讨论芯片技术时未提及生物课本PCR技术对半导体光刻的启发（必修1第6章）"
4. 准备痕迹：例如"回答模板化明显，未体现个人真实思考过程（如直接套用时政术语未消化）"

**【大学视角】**  

◉ 潜力评估（3方面）：
1. 学术适配：例如"展现的定量分析兴趣与我校大数据专业培养方向高度契合（建议关注《统计学习方法》教材）"
2. 创新潜力：例如"提出的校园垃圾分类方案包含物联网应用设想，显示工程思维（可延伸至智慧城市研究）"
3. 发展弹性：例如"面对追问时的自我修正能力，预示能适应研究型学习模式"

◉ 风险预警（3方面）：
1. 知识结构：例如"数学建模能力待加强，可能影响计量经济学课程学习（需补强选修4-4坐标系变换内容）"
2. 思维习惯：例如'二元对立'思维倾向需警惕，人文社科研究常需多元视角（推荐阅读《模糊性思维》）"
3. 适应性挑战：例如"小组合作经验较少，可能不适应PBL教学模式（建议提前参与线上协作项目）"

**【四维评分】**  
| 维度         | 评分 | 评语范例                  |
|--------------|------|-------------------------|
| 思维深度     | X/10 | "能结合课本知识分析社会现象，但..." （结合高中相关学科，如政治、历史、物理等） |
| 表达逻辑     | X/10 | "使用首先/其次分层清晰，然而..." （评价语言组织、条理性和清晰度） |
| 专业热情     | X/10 | "提及参加过相关竞赛，充分展现..." （结合学生提到的经历或对专业的理解深度） |
| 应变能力     | X/10 | "追问时稍显紧张，建议..."      （评价在意外情况或追问时的表现） |

**【培养建议思考逻辑】**
1. 从回答中识别最需改进的1个核心短板
2. 选择与目标专业关联度最高的2项能力
3. 设计可立即启动的微行动（<15分钟/天）
4. 推荐免费/低成本资源

**【具体建议范例】**

◉ 当学生回答太空探索话题时：
"建议每天用12分钟做：
1. 晨间速览「中国载人航天」公众号（培养专业敏感度）
2. 晚自习用物理必修3「宇宙速度」公式解释SpaceX回收技术（知识迁移训练）
※ 思考过程：该生展现航天兴趣但理论联系实际能力弱，需建立每日学科知识应用微习惯"

◉ 当学生讨论社会问题时：
"立即开始：
1. 每天记录1个《新闻1+1》中的争议观点，用政治必修4「辩证否定观」分析（批判思维训练）
2. 每周参与1次校园辩论社即兴发言（提升应变表达）
※ 思考过程：该生论点单薄且缺乏实证，需强化理论工具运用+高频实战演练"

# 执行要求
1. 每个反馈必须包含：  
   - 至少1个高中知识或经历关联点（具体到学科或活动）  
   - 至少1个大学学习能力预测（具体到能力类型）  
   - 1份阅读/实践推荐清单（包含具体书目、课程、活动类型）  
2. 使用教育学术语（如"最近发展区"、"元认知能力"、"知识迁移"等，解释性使用，非炫技）  
3. 区分文理科差异（文科重概念理解、逻辑推导、人文关怀；理科重原理分析、实证思维、抽象概括）
4. 结合目标学校特点给出针对性建议（例如，针对南工大强调实践能力，针对南邮大强调信息技术基础）
5. 反馈语气友好、鼓励为主，同时真诚指出不足。
6. 严格按照【反馈结构模板】输出，确保每个部分都完整。
7. **结合当前社会热点或高中生关注的话题**，引导学生思考问题与现实世界的联系。
8. **鼓励进行跨学科思考**，指出回答中潜在的与其他学科（如物理、生物、历史、地理等）的关联。
9. **提示大学阶段的学习方法和资源**，例如可以查阅的专业论文、课程或研究方向。
10. **在提供建议时，引导学生思考"如何做"**，而不仅仅是"做什么"。

考生回答：${answer}`
        }],
        max_tokens: 1400
      },
      {
        headers: {
          "Authorization": `Bearer ${SILICONFLOW_API_KEY}`,
          "Content-Type": "application/json"
        }
      }
    );

    const feedback = aiResponse.data.choices[0].message.content;
    sessions[sessionId].history.push({
      role: 'assistant',
      content: feedback,
      timestamp: new Date()
    });

    res.json({ feedback });

  } catch (error) {
    console.error('API调用失败:', error);
    res.status(500).json({ error: 'AI服务调用失败' });
  }
});

// 启动服务
app.listen(PORT, () => {
  console.log(`面试系统服务已启动，端口：${PORT}`);
});